﻿using System;
using System.Globalization;
using System.IO;
using System.Linq;
using ConnectionBase;

namespace CoreEveprod
{
	public class UpdateBaseMetrics
	{
		private string PathCsv { get; set; }
		private DataClassesEveProdDataContext _dataContextBase = new DataClassesEveProdDataContext();

		public UpdateBaseMetrics(string path)
		{
			PathCsv = path;
		}

		/// <summary>
		/// 
		/// </summary>
		public void MiseJour()
		{
			// 1. Lire le fichier pour le découper en ligne (sauf la première)
			string[] premireDecoupe = File.ReadAllLines(@PathCsv);

			/* Maintenant, je dois :
			 * - soit mettre à jour la ligne de la table.
			 * - soit ajouter une nouvelle ligne.
			 * - ne pas prendre les OrdersBuy (inutile pour nous)
			 * - ne pas prendre la première ligne (se sont les noms des colonnes)
			 * tout ca par rapport à l'ID de la table Metrics.
			 */

			// Pour chaque ligne, je découpe chaque donnée.
			for (int i = 1; i < premireDecoupe.Length; i++)
			{
				string[] decoupeLine = premireDecoupe[i].Split(',');

				#region Commentaire sur la forme des données.
				/* Voici toutes les données.
				01 - id - EVE Metrics internal ID field
				02 - type_id
				03 - price
				04 - sell - True if this order is a sell order
				05 - range
				06 - initial_volume
				07 - available_volume
				08 - sale_volume
				09 - station_id
				10 - system_id
				11 - region_id
				12 - issued_at - Last modification time for this order
				13 - expires_at - Time this order will expire if not bought out
				14 - expired - True if this order has expired
				15 - created_at - Time this order was first seen
				16 - updated_at - Last time this order was updated
				17 - trusted - True if this was from a cache source rather than a logfile source
				18 - eve_id - EVE's own pseudounique ID (recycled)
				 */
				#endregion

				// Si ce n'est pas un sell Orders, je continue.
				if(decoupeLine[3] == "f")
					continue;

				// Il faut donc préciser que nous sommes en cultureInfo US !
				CultureInfo cultureInfo = new CultureInfo("en-US");

				// Je vais voir dans la base Metrics.
				var presence = (from mm in _dataContextBase.Markets
								where mm.id == Convert.ToInt32(decoupeLine[0])
								select mm);

				// Si nous avons une ligne.
				if (presence.Count() == 1)
				{
					foreach (var marketse in presence)
					{
						marketse.id = Convert.ToInt32(decoupeLine[0]);
						marketse.type_id = Convert.ToInt16(decoupeLine[1]);
						marketse.price = Convert.ToDecimal(decoupeLine[2], cultureInfo);
						marketse.sell = decoupeLine[3];
						marketse.range = Convert.ToInt32(decoupeLine[4]);
						marketse.initial_volume = Convert.ToInt32(decoupeLine[5]);
						marketse.available_volume = Convert.ToInt32(decoupeLine[6]);
						marketse.sale_volume = Convert.ToInt32(decoupeLine[7]);
						marketse.station_id = Convert.ToInt32(decoupeLine[8]);
						marketse.system_id = Convert.ToInt32(decoupeLine[9]);
						marketse.region_id = Convert.ToInt32(decoupeLine[10]);
						marketse.issued_at = Convert.ToDateTime(decoupeLine[11], cultureInfo);
						marketse.expires_at = Convert.ToDateTime(decoupeLine[12], cultureInfo);
						marketse.expired = decoupeLine[13];
						marketse.created_at = Convert.ToDateTime(decoupeLine[14], cultureInfo);
						marketse.updated_at = Convert.ToDateTime(decoupeLine[15], cultureInfo);
						marketse.trusted = decoupeLine[16];
						marketse.eve_id = Convert.ToInt32(decoupeLine[17]);

						_dataContextBase.SubmitChanges();
					}
				}
				else
				{
					// Je crée un objet Market de la ligne SellOrder.
					Markets newMarket = new Markets();
					newMarket.id = Convert.ToInt32(decoupeLine[0]);
					newMarket.type_id = Convert.ToInt16(decoupeLine[1]);
					newMarket.price = Convert.ToDecimal(decoupeLine[2], cultureInfo);
					newMarket.sell = decoupeLine[3];
					newMarket.range = Convert.ToInt32(decoupeLine[4]);
					newMarket.initial_volume = Convert.ToInt32(decoupeLine[5]);
					newMarket.available_volume = Convert.ToInt32(decoupeLine[6]);
					newMarket.sale_volume = Convert.ToInt32(decoupeLine[7]);
					newMarket.station_id = Convert.ToInt32(decoupeLine[8]);
					newMarket.system_id = Convert.ToInt32(decoupeLine[9]);
					newMarket.region_id = Convert.ToInt32(decoupeLine[10]);
					newMarket.issued_at = Convert.ToDateTime(decoupeLine[11], cultureInfo);
					newMarket.expires_at = Convert.ToDateTime(decoupeLine[12], cultureInfo);
					newMarket.expired = decoupeLine[13];
					newMarket.created_at = Convert.ToDateTime(decoupeLine[14], cultureInfo);
					newMarket.updated_at = Convert.ToDateTime(decoupeLine[15], cultureInfo);
					newMarket.trusted = decoupeLine[16];
					newMarket.eve_id = Convert.ToInt32(decoupeLine[17]);

					_dataContextBase.Markets.InsertOnSubmit(newMarket);
					_dataContextBase.SubmitChanges();
				}
			}
		}

	}
}
